#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: database.p

##
# Módulos del sistema
from sqlobject import * # Ver cómo solucionamos esto.
from connection import connection

# Establesco la conexion
sqlhub.processConnection = connection

class Empleado(SQLObject):
    """Tabla Empleado.

    Detalle del uso del mismo
    """
    _connection = connection
    nombre = UnicodeCol(notNone=True, length=30)
    apellido = UnicodeCol(notNone=True, length=30)
    legajo = UnicodeCol(notNone=True,
            unique=True,
            length=5,
            alternateID=True)#unique=True,
    e_mail = UnicodeCol(default = "")
    telefono_interno = UnicodeCol(default="", length=30)
    telefono_externo = UnicodeCol(default="", length=30)
    direcciones = MultipleJoin("Direccion", joinColumn="empleado_id") #1:n
    historial_de_estado = MultipleJoin("HistorialDeEstado",
            joinColumn="empleado_id") #0:n
    usuario = ForeignKey("Usuario", cascade=True)
    tickets_reclamados = MultipleJoin("Ticket", joinColumn="empleado_id")

class Direccion(SQLObject):
    """Tabla Direccion.

    Detalle del uso del mismo
    """
    _connection = connection
    domicilio = UnicodeCol(notNone=True, length=30)
    numero = UnicodeCol(notNone=True, length=6)
    piso = UnicodeCol(notNone=False, length=2)
    oficina = UnicodeCol(notNone=False, length=50)
    empleado = ForeignKey("Empleado", cascade = True)

class Usuario(SQLObject):
    """Tabla Usuario.

    Detalle del uso del mismo
    """
    _connection = connection
    u_legajo = UnicodeCol(notNone=True, unique=True, length=6)
    password = UnicodeCol(notNone=True, unique=True, length=10)
    tickets_creados = MultipleJoin("Ticket", joinColumn="usuario_id")
    descripcion_cargo = UnicodeCol(notNone=True, length=50)
    empleado = ForeignKey("Empleado", cascade=True)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucion", cascade=True)
    observacion = MultipleJoin("Observacion", joinColumn="usuario_id")

class GrupoDeResolucion(SQLObject):
    """Table GrupoDeResolucion.

    Detalle del uso del mismo
    """
    _connection = connection
    estado = BoolCol(default=True)
    fecha_creacion = DateTimeCol(notNone=True)
    descripcion = UnicodeCol(notNone=True, length=300)
    nombre = UnicodeCol(notNone=True, length=100, unique=True)
    integrantes = MultipleJoin("Usuario",
            joinColumn="grupo_de_resolucion_id")
    tickets_asignados = MultipleJoin("Ticket",
            joinColumn="grupo_de_resolucion_id") #0:n
    clasificaciones = RelatedJoin("Clasificacion")#n:n
    observaciones = MultipleJoin("Observacion",
            joinColumn="grupo_de_resolucion_id") #
    intervenciones = MultipleJoin("Intervencion",
            joinColumn="grupo_de_resolucion_id")

class Clasificacion(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    nombre = UnicodeCol(notNone=True, length=100, unique=True)
    estado = BoolCol(default=True)
    grupos = RelatedJoin("GrupoDeResolucion")
    intervenciones = MultipleJoin("Intervencion", joinColumn="clasificacion_id")
    descripcion = UnicodeCol(default="")
    historial_de_clasificacion = ForeignKey("HistorialDeClasificacion",
            cascade=True)

class Observacion(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    descripcion = UnicodeCol(notNone=True)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucion", cascade=True)
    intervencion = ForeignKey("Intervencion", cascade=True)
    usuario = ForeignKey("Usuario", cascade=True)
    fecha = DateTimeCol()

class Intervencion(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    estado = BoolCol(default=False)
    #!!!FIXME: el estado anterior tiene que ser False por default, y a la hora
    #          de empesar a trabajar en el reclamo se activa
    fecha = DateTimeCol()
    observaciones = MultipleJoin("Observacion", joinColumn="intervencion_id")
    clasificacion = ForeignKey("Clasificacion", cascade=True)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucion", cascade=True)
    ticket = ForeignKey("Ticket", cascade=True)

class HistorialDeClasificacion(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    fecha = DateTimeCol()
    clasificacion = ForeignKey("Clasificacion")
    ticket = ForeignKey("Ticket")

class HistorialDeEstado(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    fecha = DateTimeCol()
    usuario = ForeignKey("Usuario", cascade=True)
    estado = ForeignKey("Estado", cascade=True)
    ticket = ForeignKey("Ticket", cascade=True)

class Estado(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    descripcion = UnicodeCol(notNone=True, length=100)
    nombre = UnicodeCol(notNone=True, length=50)
    historial_de_estado = ForeignKey("HistorialDeEstado", cascade=True)

class Ticket(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    numero_ticket = IntCol() #Podemos tomar el id como el numero
    fecha_cierre = DateTimeCol()
    fecha_creacion = DateTimeCol(notNone=True)
    descripcion = UnicodeCol(notNone=True, length=300)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucion", cascade=True)
    intervenciones = MultipleJoin("Intervencion", joinColumn="ticket_id")
    historial_de_estado = MultipleJoin("HistorialDeEstado",
            joinColumn="ticket_id")
    historial_de_clasificacion = MultipleJoin("HistorialDeClasificacion",
            joinColumn="ticket_id")
    empleado = ForeignKey("Empleado")
    usuario_creacion = ForeignKey("Usuario", cascade=True)
    usuario_cierre = ForeignKey("Usuario", cascade=True)
    cerrado = BoolCol(default=False)

##
# Si no existen las bases de datos las creamos.
lista = [Empleado, Ticket, Usuario, Direccion, GrupoDeResolucion,
        Clasificacion, Observacion, Intervencion, HistorialDeClasificacion,
        HistorialDeEstado, Estado]
for tabla in lista:
    tabla.createTable(ifNotExists=True)

